1 /* 2 Copyright: Marcelo S. N. Mancini (Hipreme|MrcSnm), 2018 - 2021 3 License: [https://creativecommons.org/licenses/by/4.0/|CC BY-4.0 License]. 4 Authors: Marcelo S. N. Mancini 5 6 Copyright Marcelo S. N. Mancini 2018 - 2021. 7 Distributed under the CC BY-4.0 License. 8 (See accompanying file LICENSE.txt or copy at 9 https://creativecommons.org/licenses/by/4.0/ 10 */ 11 module hip.event.handlers.keyboard_layout; 12 import hip.event.handlers.keyboard; 13 import hip.util.data_structures; 14 15 /** 16 * This class is used for getting user text input based on the keyboard layout implementation 17 */ 18 abstract class KeyboardLayout 19 { 20 enum KeyState 21 { 22 NONE = 0, 23 ALT = 1 << 0, 24 CTRL = 1 << 1, 25 SHIFT = 1 << 2, 26 } 27 abstract void initialize(); 28 this(){initialize();} 29 30 protected string[Pair!(char, int)] kb; 31 static alias KeyStroke = Pair!(char, int); 32 33 pragma(inline, true) 34 final void addKey(char key, string output, KeyState ks = KeyState.NONE) 35 { 36 kb[KeyStroke(key, ks)] = output; 37 } 38 39 final string getKey(char key, KeyState ks) 40 { 41 string* str = (KeyStroke(key, ks) in kb); 42 if(str == null) 43 { 44 return ""; 45 } 46 return *str; 47 } 48 49 pragma(inline, true) 50 final void addKeyAnyState(char key, string output) 51 { 52 import std.traits:EnumMembers; 53 int[] members = cast(int[])[EnumMembers!KeyState]; 54 55 for(int i = 0; i < members.length; i++) 56 addKey(key, output, cast(KeyState)members[i]); 57 58 } 59 60 61 final void generateDefaults() 62 { 63 with(HipKey) 64 { 65 addKeyAnyState(SPACE, " "); 66 addKeyAnyState(ENTER, "\n"); 67 addKey(_0, "0"); 68 addKey(_1, "1"); 69 addKey(_2, "2"); 70 addKey(_3, "3"); 71 addKey(_4, "4"); 72 addKey(_5, "5"); 73 addKey(_6, "6"); 74 addKey(_7, "7"); 75 addKey(_8, "8"); 76 addKey(_9, "9"); 77 78 } 79 } 80 } 81 82 83 class KeyboardLayoutABNT2 : KeyboardLayout 84 { 85 override void initialize() 86 { 87 generateDefaults(); 88 with(HipKey) 89 { 90 addKey(A, "a"); 91 addKey(B, "b"); 92 addKey(C, "c"); 93 addKey(D, "d"); 94 addKey(E, "e"); 95 addKey(F, "f"); 96 addKey(G, "g"); 97 addKey(H, "h"); 98 addKey(I, "i"); 99 addKey(J, "j"); 100 addKey(K, "k"); 101 addKey(L, "l"); 102 addKey(M, "m"); 103 addKey(N, "n"); 104 addKey(O, "o"); 105 addKey(P, "p"); 106 addKey(Q, "q"); 107 addKey(R, "r"); 108 addKey(S, "s"); 109 addKey(T, "t"); 110 addKey(U, "u"); 111 addKey(V, "v"); 112 addKey(W, "w"); 113 addKey(X, "x"); 114 addKey(Y, "y"); 115 addKey(Z, "z"); 116 addKey(MINUS, "-"); 117 addKey(EQUAL, "="); 118 addKey(BRACKET_LEFT, "");//Not supported 119 addKey(BRACKET_RIGHT, "["); 120 addKey(BACKSLASH, "]"); 121 addKey(SLASH, ";"); 122 addKey(PERIOD, "."); 123 addKey(COMMA, ","); 124 addKey(QUOTE, "~"); 125 addKey(BACKQUOTE, "'"); 126 127 //Shift 128 addKey(A, "A", KeyState.SHIFT); 129 addKey(B, "B", KeyState.SHIFT); 130 addKey(C, "C", KeyState.SHIFT); 131 addKey(D, "D", KeyState.SHIFT); 132 addKey(E, "E", KeyState.SHIFT); 133 addKey(F, "F", KeyState.SHIFT); 134 addKey(G, "G", KeyState.SHIFT); 135 addKey(H, "H", KeyState.SHIFT); 136 addKey(I, "I", KeyState.SHIFT); 137 addKey(J, "J", KeyState.SHIFT); 138 addKey(K, "K", KeyState.SHIFT); 139 addKey(L, "L", KeyState.SHIFT); 140 addKey(M, "M", KeyState.SHIFT); 141 addKey(N, "N", KeyState.SHIFT); 142 addKey(O, "O", KeyState.SHIFT); 143 addKey(P, "P", KeyState.SHIFT); 144 addKey(Q, "Q", KeyState.SHIFT); 145 addKey(R, "R", KeyState.SHIFT); 146 addKey(S, "S", KeyState.SHIFT); 147 addKey(T, "T", KeyState.SHIFT); 148 addKey(U, "U", KeyState.SHIFT); 149 addKey(V, "V", KeyState.SHIFT); 150 addKey(W, "W", KeyState.SHIFT); 151 addKey(X, "X", KeyState.SHIFT); 152 addKey(Y, "Y", KeyState.SHIFT); 153 addKey(Z, "Z", KeyState.SHIFT); 154 155 addKey(_1, "!", KeyState.SHIFT); 156 addKey(_2, "@", KeyState.SHIFT); 157 addKey(_3, "#", KeyState.SHIFT); 158 addKey(_4, "$", KeyState.SHIFT); 159 addKey(_5, "%", KeyState.SHIFT); 160 addKey(_6, "¨", KeyState.SHIFT); 161 addKey(_7, "&", KeyState.SHIFT); 162 addKey(_8, "*", KeyState.SHIFT); 163 addKey(_9, "(", KeyState.SHIFT); 164 addKey(_0, ")", KeyState.SHIFT); 165 166 addKey(MINUS, "_", KeyState.SHIFT); 167 addKey(EQUAL, "+", KeyState.SHIFT); 168 addKey(BRACKET_LEFT, "`", KeyState.SHIFT); 169 addKey(BRACKET_RIGHT, "{", KeyState.SHIFT); 170 addKey(BACKSLASH, "}", KeyState.SHIFT); 171 addKey(SLASH, ":", KeyState.SHIFT); 172 addKey(PERIOD, ">", KeyState.SHIFT); 173 addKey(COMMA, "<", KeyState.SHIFT); 174 addKey(BACKQUOTE, "\"", KeyState.SHIFT); 175 176 import hip.console.log; 177 178 rawlog(kb[KeyStroke('A', KeyState.NONE)]); 179 180 } 181 } 182 }